import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Scanner;

/**
 * 
 * TLV解码
 * 
 * TLV编码是按 [Tag Length Value] 格式进行编码的，一段码流中的信元用 Tag 标识，Tag 在码流中唯一不重复，Length 表示信元Value的长度，Value 表示信元的值。

码流以某信元的 Tag 开头，Tag 固定占一个字节，Length 固定占两个字节，字节序为小端序。
现给定 TLV 格式编码的码流，以及需要解码的信元 Tag，请输出该信元的 Value。
输入码流的 16 进制字符中，不包括小写字母，且要求输出的 16 进制字符串中也不要包含小写字母；码流字符串的最大长度不超过 50000 个字节。

输入描述
输入的第一行为一个字符串，表示待解码信元的Tag；

输入的第二行为一个字符串，表示待解码的 16 进制码流，字节之间用空格分隔。

输出描述
输出一个字符串，表示待解码信元以 16 进制表示的 Value。

 * 
 */

 /*
  * 
  输入	31
32 01 00 AE 90 02 00 01 02 30 03 00 AB 32 31 31 02 00 32 33 33 01 00 CC
输出	32 33
说明	
需要解析的信元的Tag是31，
从码流的起始处开始匹配，
第一个信元的Tag是32，信元长度为1（01 00，小端序表示为1）；
第二个信元的Tag是90，其长度为2；
第三个信元的Tag是30，其长度为3；
第四个信元的Tag是31，其长度为2（02 00），
所以返回长度后面的两个字节即可，即32 33。

查看方式
tag(1位) + length(2位) + value(根据length来确定几位)

[{32} {01 00} {AE}] [{90} {02 00} {01 02}] [{30} {03 00} {AB 32 31}] [{31} {02 00} {32 33}] [{33} {01 00} {CC}]

tag = 31  的 信号 [{31} {02 00} {32 33}] value = 32 33

重点：

1、while(position < arr.length)  循环
2、 获取tag 和 2 位长度
String tag = codeStreamArr[position++];
String len1 = codeStreamArr[position++];
String len2 = codeStreamArr[position++];
3、计算长度
int len = Integer.parseInt(len1, 16) + Integer.parseInt(len2, 16);  //16 位
4、根据计算的长度获取 value
String[] valueArr = new String[len];
//截取数组value
System.arraycopy(codeStreamArr, position, valueArr, 0, len);
codeStreamArr  原数组
position  从原数组中的 position 截取
valueArr 新建的长度为len的数组
新建数组 填充数据  0～len
5、输出 value 按空格分割
String value = String.join(" ", valueArr);

  */

public class TLV解码 {

    public static void main(String[] args){

        try{

            //接收输入
            Scanner scanner = new Scanner(System.in);
            //接收tag
            String tagInfo = scanner.nextLine();
            //接收码流
            String codeStream = scanner.nextLine();

            //按空格拆分
            String[] codeStreamArr = codeStream.split(" ");

            int position = 0;
            
            //遍历
           while (position < codeStreamArr.length) {

            String tag = codeStreamArr[position++];
            String len1 = codeStreamArr[position++];
            String len2 = codeStreamArr[position++];

            //计算长度 16 进制
            int len = Integer.parseInt(len1, 16) + Integer.parseInt(len2, 16);
            
            String[] valueArr = new String[len];
            //截取数组value
            System.arraycopy(codeStreamArr, position, valueArr, 0, len);

            //如果tag 相等，则输出 value
            if(tag.equals(tagInfo)){

                String value = String.join(" ", valueArr);

                System.out.println(value);

            }

            position+=len;


           }



        }catch(Exception e){
            e.printStackTrace();
            System.out.println("程序异常"+(null == e ? "" : e.getMessage()));
        }
    }

    // public static class StreamBean{

    //     public String tag; // 一位
    //     public String length; //长度
    //     public String value; //值

    // }
}
